package data;

import business.*;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.sql.SQLException;
import java.sql.ResultSet;


public class UtilizadoresData extends InterfaceBD {

    public UtilizadoresData() {
        super();
    }

    public int addCliente(GregorianCalendar dataAdesao, String morada, String nome, String passwd) throws Exception {

        int codigo = getnextCodU();
        /*    public String insereUtilizador(int codU, String nome, String password, int tipo, String morada,GregorianCalendar dataAdesao, String debito, String factura){
*/
        String query = insereUtilizador(codigo,nome,passwd,0,morada,dataAdesao,"nao","nao");
        System.out.println(query);
        res = st.executeUpdate(query);


        return codigo;
    }

    public int addEmpregado(String nome, String passwd, int tipo,GregorianCalendar dataAdesao) throws SQLException {
        int cod = getnextCodU();
        String query = insereUtilizador(cod,nome,passwd,tipo,"Braga",dataAdesao,"nao","nao");
        System.out.println(query);

        res = st.executeUpdate(query);

        return cod;
    }


    public void removerUtilizador(int codUtilizador) throws Exception{

        String query = "DELETE from Utilizador where cod_u = '"+codUtilizador+ "'";
        System.out.println(query);

        st.executeUpdate(query);
    }

    public ArrayList<Utilizador> getListaUtilizadores() throws SQLException {
        ArrayList<Utilizador> resultado = new ArrayList<Utilizador>();
        String query = "Select * from utilizador";
        System.out.println(query);

        rs = st.executeQuery(query);


        while(rs.next()){
            if(rs.getInt("tipo") ==0){
                boolean factura = rs.getString("factelec").toLowerCase().equals("sim");
                boolean debito = rs.getString("debdir").toLowerCase().equals("sim");

                GregorianCalendar dataAdesao = new GregorianCalendar();
                dataAdesao.setTime(rs.getDate(8));
                resultado.add(new Cliente(rs.getInt("cod_u"),rs.getString("password"),rs.getString("nomeu"),rs.getString("localidadeu"),dataAdesao,factura,debito));
            }else{
                GregorianCalendar dataAdesao = new GregorianCalendar();
                dataAdesao.setTime(rs.getDate(8));
                resultado.add(new Empregado(rs.getInt("cod_u"),rs.getString("password"),rs.getString("nomeu"),rs.getInt("tipo"),dataAdesao));
            }
        }


        return resultado;
    }

    public Utilizador getUtilizadorByCod(int codUtilizador) throws Exception{
        String query = "Select * from Utilizador where cod_u ="+codUtilizador;
        System.out.println(query);

        rs = st.executeQuery(query);
        boolean aux = false;
        Utilizador res = null;
        while(rs.next()){
            aux = true;
            if(rs.getInt("tipo")==0){
                GregorianCalendar dataAdesao = new GregorianCalendar();
                dataAdesao.setTime(rs.getDate(8));
                 boolean factura = rs.getString("factelec").toLowerCase().equals("sim");
                boolean debito = rs.getString("debdir").toLowerCase().equals("sim");
                res = new Cliente(rs.getInt("cod_u"),rs.getString("password"),rs.getString("nomeu"),rs.getString("localidadeu"),dataAdesao,factura,debito );

            }else{
                GregorianCalendar dataAdesao = new GregorianCalendar();
                dataAdesao.setTime(rs.getDate(8));
                res = new Empregado(rs.getInt(1),rs.getString(3),rs.getString(2),rs.getInt(4),dataAdesao);

            }
        }

        if(aux == false){

            throw new Exception("Utilizador Nao existe na BaseDados");
        }else{
            return res;

        }
    }

    public void setDebitoDirecto(int codUtilizador, boolean dd) throws SQLException {
        String debito;
        if(dd == true){
            debito = "sim";
        }else{
            debito = "nao";
        }
        String query = "UPDATE Utilizador SET debdir = "+debito+" where cod_u = "+codUtilizador;
        System.out.println(query);

        res = st.executeUpdate(query);
    }

    public void setFactElectronica(int codUtilizador, boolean fe) throws SQLException {
        String factura;
        if(fe == true){
            factura = "sim";
        }else{
            factura = "nao";
        }
        String query = "UPDATE Utilizador SET factelec = "+factura+" where cod_u = "+codUtilizador;
        System.out.println(query);

        res = st.executeUpdate(query);

    }

    public GregorianCalendar dataAdesaoCliente(int codCliente) throws Exception {
        String query = "Select * from Utilizador where cod_u ="+codCliente;
        System.out.println(query);

        rs = st.executeQuery(query);
        GregorianCalendar dataAdesao = null;
        boolean aux = false;
        Utilizador res = null;
        while(rs.next()){
            aux = true;

                dataAdesao = new GregorianCalendar();
                dataAdesao.setTime(rs.getDate(8));
                return dataAdesao;
        }

        if(aux == false){

            throw new Exception("");
        }
        return dataAdesao;

    }

    public void removerCliente(int codCliente) throws SQLException {
//        String queryaux = "Select tipo from Utilizador where cod_u="+codCliente+""
        
        String query = "DELETE from Utilizador where cod_u = "+codCliente+ "";
        System.out.println(query);

        st.executeUpdate(query);
    }


    public ArrayList<Empregado> consultarEmpregados() throws SQLException {
        ArrayList<Empregado> resultado = new ArrayList<Empregado>();
        String query = "Select * from Utilizador where tipo in(1,2,3,4)";
        System.out.println(query);

        rs = st.executeQuery(query);
        System.out.println("depois");


        while(rs.next()){
                boolean factura = rs.getString("factelec").toLowerCase().equals("sim");
                boolean debito = rs.getString("debdir").toLowerCase().equals("sim");

                GregorianCalendar dataAdesao = new GregorianCalendar();
                dataAdesao.setTime(rs.getDate(8));

                resultado.add(new Empregado(rs.getInt("cod_u"),rs.getString("password"),rs.getString("nomeu"),rs.getInt(4),dataAdesao));

        }

        return resultado;
    }



    public GregorianCalendar dataAdesaoEmpregado(int codCliente) throws Exception {
        String query = "Select * from Utilizador where cod_u ="+codCliente;
        System.out.println(query);

        rs = st.executeQuery(query);
        GregorianCalendar dataAdesao = null;
        boolean aux = false;
        Utilizador res = null;
        while(rs.next()){
            aux = true;

                dataAdesao = new GregorianCalendar();
                dataAdesao.setTime(rs.getDate(8));
                return dataAdesao;
        }

        if(aux == false){

            throw new Exception("");
        }
        return dataAdesao;

    }


    public void removerEmpregado(int codEmpregado) throws SQLException {
        String query = "DELETE from Utilizador where cod_u = '"+codEmpregado+ "'";
        System.out.println(query);

        st.executeUpdate(query);
    }

    public int getnextCodU() throws SQLException{

        ResultSet rs;
        int num = 0;

        try {
            rs = st.executeQuery("SELECT MAX(cod_u) FROM Utilizador");
            rs.next();
            num = rs.getInt(1);
        }
        catch (SQLException e) {

            //
        }
        return(num+1);
    }

    public String insereUtilizador(int codU, String nome, String password, int tipo, String morada,GregorianCalendar dataAdesao, String debito, String factura){
        int dia =  dataAdesao.get(GregorianCalendar.DAY_OF_MONTH)+1;
        int mes = dataAdesao.get(GregorianCalendar.MONTH)+1;
        int ano = dataAdesao.get(GregorianCalendar.YEAR);
        String dataS = ano+"-"+mes+"-"+dia;
        return "Insert INTO Utilizador Values("+codU+",'"+nome+"','"+password+"',"+tipo+",'"+morada+"','"+factura+"','"+debito+"','"+dataS+"')";


    }

    public ArrayList<String> getListaCidades() throws SQLException{
        ArrayList<String> resultado = new ArrayList<String>();
        String query = "Select local from Localidade";
        System.out.println(query);
        
        rs = st.executeQuery(query);

        while(rs.next())
        {
            resultado.add( rs.getString("local"));
        }
        return resultado;

    }

}
